/*
  泛型接口的使用
*/

// 函数接口 -- 限制函数形参的一种接口
interface myFuna {
  (value1: string, value2: string): string
}

let fun1: myFuna = function (a1: string, a2: string): string {
  return a1 + a2
}
console.log(fun1('name', 'jimmy')) //  namejimmy

// 报错  不符合规范  一旦要换一个类型  都得重写一个接口  代码耦合度太高
// let fun2: myFuna = function (a1: number, a2: number): number {
//   return a1+a2
// }

/*
  所以我们就要使用 泛型 来定义接口  就可以最大程度的来实现接口的复用了  
    定义方式有两种
*/

// 方式 1
interface myfun1<T> {
  (value1: T, value2: T): T
}
let functin1: myfun1<number> = function (a1: number, a2: number): number {
  return a1 + a2
}

console.log(functin1(5, 8)) // 13
let functin2: myfun1<string> = function (a1: string, a2: string): string {
  return `${a1}喜欢${a2}`
}
console.log(functin2('Jimmy', '打代码')) // Jimmy喜欢打代码

// 方式2
interface myfun2 {
  <T>(value1: T, value2: T): T
}
let functin3: myfun2 = function <T>(a1: T, a2: T): T {
  return a1
}
functin3<number>(10, 9)
// 这个是方式2

/*
  使用方式 1 来丁姐泛型接口是推荐的方式 更加的好用  也更好理解一些

    接口在使用了泛型之后  也是可以最大程度的让接口复用性更高
*/
